/*
 * Created on 29/06/2006
 *
 */
package ar.com.cubika.trainees.view;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import ar.com.cubika.trainees.bean.transportes.Ruta;
import ar.com.cubika.trainees.dao.RutaDAO;
import ar.com.cubika.trainees.dao.UrlDAO;
import ar.com.cubika.trainees.exceptions.BusinessCompositeException;
import ar.com.cubika.trainees.exceptions.BusinessException;

public class AgregarRutaServletConInnerClass extends TransportesServlet {

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        if (!this.checkOperacionPermitida("agregar una ruta", request, response)) {
            return;
        }
       
        AgregarRutaProcess process = new AgregarRutaProcess(request);
        try {
            process.processRequest();
            // y claro, hay que forwardear a algun lado
            request.getRequestDispatcher("/viewEmpresa").forward(
                    request, response);
        } catch (BusinessCompositeException be) {
            request.setAttribute("mensajesDeError", process.getErrores());
            request.getRequestDispatcher("/crearUnaRuta").forward(
                    request, response);
        } catch (Exception be) {
            List lista = new ArrayList();
            lista.add("ocurrio un problema no especificado");
            request.setAttribute("mensajesDeError", lista);
            request.getRequestDispatcher("/crearUnaRuta").forward(
                    request, response);
        }
    }

    
    private static class AgregarRutaProcess {
        private HttpServletRequest request;
        private List<String> errores;
        
        public AgregarRutaProcess(HttpServletRequest request) {
            this.request = request;
            this.errores = new ArrayList<String>();
        }
        
        public void processRequest() throws Exception {
            String origen = this.getParameterString(
                    request, "origen", "el origen");
            String destino = this.getParameterString(
                    request, "destino", "el destino");
            long kmBuenos = this.getParameterLong(
                    request, "kmBuenos", "la cantidad de Km. en buen estado");
            long kmMalos = this.getParameterLong(
                    request, "kmMalos", "la cantidad de Km. en mal estado");
            String codigoZona = this.getParameterString(
                    request, "zona", "la zona");
            boolean esConPeajes = request.getParameterMap().containsKey("conPeajes");
            String tipoDeRuta = this.getParameterString(
                    request, "tipo", "el tipo de ruta");

            if (kmBuenos + kmMalos > 20000) {
                this.handleError("La ruta no puede tener mas de 20000 km de extension total");
            }
            this.checkErrores();
            int id_ruta = 0;
            Ruta ruta = new Ruta(origen, destino);
            ruta.setKmBuenCamino(kmBuenos);
            ruta.setKmMalCamino(kmMalos);
            ruta.setConPeajes(esConPeajes);
            if (tipoDeRuta.equals("nacional")) {
                ruta.setNacional(true);
            } else if (tipoDeRuta.equals("privada")) {
                ruta.setPrivada(true);
            } else if (tipoDeRuta.equals("provincial")) {
                ruta.setProvincial(true);
            }
            
            id_ruta = RutaDAO.getInstance().insertRuta(ruta);
    		UrlDAO.getInstance().putUrls(ruta.getUrls(), id_ruta);
            Ruta.registrarRuta(ruta);
        }
        
        private void checkErrores() {
            if (!this.errores.isEmpty()) {
                throw new BusinessCompositeException(this.errores);
            }
            
        }

        public List getErrores() {
            return this.errores;
        }

        private long getParameterLong(HttpServletRequest request, String paramName, String mensaje) {
            String valor = request.getParameter(paramName);
            if (valor.equals("")) {
                this.handleError(mensaje + " no ha sido completada/o");
                return 0;
            } else {     
                try {
                    return new Long(request.getParameter(paramName)).longValue();
                } catch (NumberFormatException e) {
                    this.handleError(mensaje + "ingresada/o no corresponde a un numero valido");
                    return 0;
                }
            }
        }

        private String getParameterString(HttpServletRequest request, String paramName, String mensaje) {
            String valor = request.getParameter(paramName);
            if (valor == null || valor.equals("")) {
                this.handleError(mensaje + " no ha sido completada/o");
            }        
            return valor;
        }

        private void checkNotEmpty(String valor, String mensaje) {
        }
        
        private void handleError(String message) {
            errores.add(message);
        }
        
    }

}
